package com.cskaoyan.javase.thread._2api;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 安全的线程中断手段:
 *      1.如果下载完成后,中断线程,那就无所谓,无事发生
 *      2.如果下载的过程中,中断线程,下载失败了,应该打印日志提醒用户,做出相应处理
 *
 * @since 11:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class SafelyStopDemo {
    public static void main(String[] args) {
        SafelyDownloadThread sdt = new SafelyDownloadThread("后台下载线程");
        sdt.start();
        try {
            Thread.sleep(3000);
            sdt.safelyStop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class SafelyDownloadThread extends Thread {

    // true指示正常下载,false指示中断线程,中断下载
    private boolean flag = true;

    public SafelyDownloadThread(String name) {
        super(name);
    }

    public void safelyStop() {
        flag = false;
    }

    @Override
    public void run() {
        /*
            为了让该线程安全中断,必须让它执行完毕,所以该线程的执行就要分成两个情况:
                1.正常的下载完成,执行完毕线程
                2.未完成下载,在中间停止下载,这时打印日志,提醒用户
            为了指示这两种状态,给出一个布尔值flag
            该布尔值为true时,表示正常完成下载
            该布尔值为false时,在中间停止下载,这时打印日志,提醒用户

            在这种情况下,所谓的安全中断线程是什么意思?
            让flag的值是false,而它的值默认是true,不中断
         */
        for (int i = 10; i <= 100; i += 10) {
            if (flag) {
                // 表示正常下载
                System.out.println("已下载" + i + "%");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 100) {
                    System.out.println("下载已完成!");
                }
            } else {
                System.out.println("此时线程中断,下载任务没有完成!");
                // 表示在某个时刻,flag变成了false,此时中断下载,做相应处理
                PrintWriter write = null;
                try {
                    write = new PrintWriter(new FileOutputStream("log.txt", true));
                    // 2022-02-01 xx:xx:xx
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    // date对象 --> 日期格式字符串
                    String time = sdf.format(new Date());
                    write.println(time + " 信息 [" + getName() + "] 下载任务中断,请注意处理!");
                    write.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    if (write != null) {
                        write.close();
                    }
                }
                // 下载线程已经中断了,循环不再进行
                break;
            }

        }

    }
}
